Skip to content

ZCU-DATA/Backport: Fix home-page SSR->CSR flicker#1312

Open
jr-rk wants to merge 6 commits into
customer/zcu-datafrom
zcu-data/fe-fix-home-page-flicker
Open

ZCU-DATA/Backport: Fix home-page SSR->CSR flicker#1312
jr-rk wants to merge 6 commits into
customer/zcu-datafrom
zcu-data/fe-fix-home-page-flicker

Conversation

@jr-rk

@jr-rk jr-rk commented Jun 17, 2026

Copy link
Copy Markdown

Problem description

Backport from #1287

Analysis

(Write here, if there is needed describe some specific problem. Erase it, when it is not needed.)

Problems

(Write here, if some unexpected problems occur during solving issues. Erase it, when it is not needed.)

Sync verification

If en.json5 or cs.json5 translation files were updated:

  • Run yarn run sync-i18n -t src/assets/i18n/cs.json5 -i to synchronize messages, and changes are included in this PR.

Manual Testing (if applicable)

Copilot review

  • Requested review from Copilot

@jr-rk jr-rk self-assigned this Jun 17, 2026
@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 315e508e-3a1e-4c5f-9291-4b1334177750

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Backports the SSR→CSR “home-page flicker” mitigation by keeping SSR-rendered DOM visible during Angular 15 bootstrap and ensuring custom-themed wrappers are eagerly loaded to reduce the teardown/rebuild gap.

Changes:

  • Re-enable CustomEagerThemeModule in the eager themes bundle to avoid custom theme wrappers being lazy-loaded during initial render.
  • Add an inline SSR-overlay bootstrap script + CSS in src/index.html, and hook its removal to ApplicationRef.isStable in AppComponent.
  • Add typings/tests for the new window.__dspaceRemoveSsrOverlay global and raise Angular initial bundle budgets.

Reviewed changes

Copilot reviewed 5 out of 8 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/typings.d.ts Adds a typed Window.__dspaceRemoveSsrOverlay global declaration used by the overlay removal hook.
src/themes/eager-themes.module.ts Ensures the custom eager theme module is included to reduce SSR→CSR visual gaps.
src/index.html Introduces the inline overlay/CSS that preserves SSR DOM & styles until Angular becomes stable.
src/app/app.component.ts Removes the overlay when ApplicationRef.isStable first becomes true (browser-only).
src/app/app.component.spec.ts Adds unit tests verifying the overlay removal callback behavior and no-op behavior when absent.
angular.json Increases initial bundle size budgets to account for the added eager theme/module weight.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/index.html
jr-rk and others added 2 commits June 18, 2026 11:08
The overlay remover bailed out via `if (!el) return;` before unhiding
<ds-app>, so if the overlay node went missing (browser extension, race,
external script) the app stayed visibility:hidden forever -> blank page,
plus the kept SSR styles leaked. Unhide the app and clean up the kept
styles unconditionally, before checking for the overlay node.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
_build.log and _spec.log are local deploy-tooling output that should
never have been tracked. Remove them and gitignore /_*.log.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 7 changed files in this pull request and generated 1 comment.

Comment thread src/app/app.component.spec.ts Outdated
Make the ApplicationRef.isStable override in the removeSsrOverlayWhenStable
suite configurable and restore the original descriptor in afterEach, so the
patched observable can't leak onto the shared TestBed instance. Add a test
for the requestAnimationFrame-absent fallback branch of the remover.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Propagates VSB-TUO's fix #1317 to this instance. The overlay was removed when
ApplicationRef.isStable settled, but isStable can be delayed for seconds by
post-login admin zone activity (auth work, background polling, third-party
scripts) - during which the live app stays hidden under the SSR mask and the
page renders but is non-interactive (dataquest-dev/dspace-customers#725).

Switch removal to the same condition root.component.html uses to show real
content: !isAuthenticationBlocking && !isThemeLoading. Drop the now-unused
ApplicationRef injection and the 50ms pad; keep the 15s hard fallback as a
catastrophic safety net. Tests and the theme-service mock updated to match.

Ref: #1317

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jr-rk

jr-rk commented Jun 20, 2026

Copy link
Copy Markdown
Author

Switched the SSR overlay-removal trigger from ApplicationRef.isStable to a content-visible signal (!isAuthenticationBlocking && !isThemeLoading), propagating VSB-TUO's fix #1317.

isStable can stay unsettled for seconds after login (esp. admin: background polling / zone tasks / third-party scripts), leaving the page rendered but non-interactive under the SSR mask — the bug VSB-TUO already hit (dataquest-dev/dspace-customers#725). Applied identically across TUL/SAV/ZCU-DATA/ZCU-PUB so the four stay unified.

@jr-rk jr-rk removed the request for review from milanmajchrak June 23, 2026 07:17
Supersedes the #1317 content-visible trigger backported earlier. That gate
(!isAuthenticationBlocking && !isThemeLoading) still revealed a half-built page
on hard reload, so VSB-TUO's #1318/#1321 keep the snapshot until the routed
<ds-app> DOM has SETTLED (MutationObserver + quiet window, with a content
height / #main-content check and a 10s cap). The overlay is now a purely
visual mask, so the live app stays interactive underneath while it rebuilds
(closes dspace-customers#725 - "looks rendered but not clickable").

index.html, app.component.ts, spec and typings are synced to VSB-TUO's final
version; the VSB-only ngAfterViewInit delay(0) is omitted (these instances
don't carry it).

Ref: #1318, #1321

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jr-rk

jr-rk commented Jun 30, 2026

Copy link
Copy Markdown
Author

Advanced the overlay code from the #1317 content-visible gate to VSB-TUO's final mechanism (#1318 + #1321).

The gate (!isAuthenticationBlocking && !isThemeLoading) still revealed a half-built page on hard reload. The final version keeps the SSR snapshot until the routed <ds-app> DOM has settled (MutationObserver + quiet window, content-height / #main-content check, 10s cap), and makes the overlay a purely visual mask so the live app stays interactive underneath (closes dspace-customers#725). Synced to VSB-TUO's final index.html / app.component.ts / spec / typings (the VSB-only delay(0) is omitted). Applied identically across TUL/SAV/ZCU-DATA/ZCU-PUB; tests green on 16.x + 18.x.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants